#!/usr/bin/env python
# *-* coding: utf-8 *-*
#imports
import pygame,os,sys,time,cPickle
from pygame.locals import *
import jogo,classico


def insereRank(dicionario, posicao, listaDados):
	removido = dicionario[posicao]
	dicionario[posicao] = listaDados
	novaPosicao = posicao + 1
	if posicao < len( dicionario.keys()):
		insereRank(dicionario,novaPosicao,removido)

def verifica_rank(rank,tempo):
	
	####### se o arquivo de ranking nao existir ele cria #######
	if rank != "":
		try:
			mapa = cPickle.load(file(rank))
		except: 
			default_rank = {1:["Jeymisson",700],2:["Kaio",800],3:["Danilo",900],4:["Felipe",1000],5:["RoadRunner",1200]}
			cPickle.dump(default_rank,file(rank,"w"))
			mapa = cPickle.load(file(rank))
		
		for posicao in sorted(mapa.keys()):
			if tempo < mapa[posicao][1]:
				return posicao
	return None

def classic(linha,coluna,qtnd_bombas,modo=""):
	
	pygame.init()
	time_init = int(round(pygame.time.get_ticks()/1000))
	matriz = jogo.jogo(linha,coluna,qtnd_bombas)
	display = pygame.display.set_mode(((matriz.linha*30),(matriz.coluna*30+30)),0,32)
	pygame.display.set_caption('Minesweepy Classic')
	fundo,vazio = pygame.image.load("Novas_Imagens"+os.sep+"fundo.png").convert(),pygame.image.load("Novas_Imagens"+os.sep+"fundovazio.png").convert()
	bomba,bandeira = pygame.image.load("Novas_Imagens"+os.sep+"bomba.png").convert(),pygame.image.load("Novas_Imagens"+os.sep+"bandeira.png").convert()
	img_nums = [pygame.image.load('Novas_Imagens' + os.sep + 'num' + str(i) + '.png').convert() for i in xrange(1,9)]
	texto = pygame.font.SysFont("Courrier New",37)
	clock = pygame.time.Clock()
	cor = (255,255,255)
	duvida = texto.render(" ?",True,cor)
	som_perdeu = pygame.mixer.Sound("sons" + os.sep + "exp.ogg")
	som_perdeu.set_volume(1.0)
	perdeu = False


	funcionando = True

	while funcionando :
		clock.tick(50)
		for event in pygame.event.get():
			if event.type == QUIT:
				funcionando = False
			if event.type == KEYDOWN and event.key == K_ESCAPE:
				funcionando = False
			
			
			###### evento vitoria ######
			if perdeu == False:
				if ((matriz.linha * matriz.coluna) - matriz.contador)  == matriz.qtd_bombas :
					time.sleep(1)
					return win(modo,segundos)
				
					
				if event.type == MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[2] :
					try:
						x,y = (pygame.mouse.get_pos()[0]/30),(pygame.mouse.get_pos()[1]/30)
																												
						if matriz.matriz_blit[x][y] == 9:
							matriz.matriz_blit[x][y] = "b"
							display.blit(bandeira,(x*30,y*30))
																	
						elif matriz.matriz_blit[x][y] == "b":
							matriz.matriz_blit[x][y] = "?"
							display.blit(fundo,(x*30,y*30))
							display.blit(duvida,(x*30,y*30))
														
						elif matriz.matriz_blit[x][y] == "?":
							matriz.matriz_blit[x][y] = 9
							display.blit(fundo,(x*30,y*30))
					
					except: pass
						
				elif event.type == MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0]:
					try:
						x,y = (pygame.mouse.get_pos()[0]/30),(pygame.mouse.get_pos()[1]/30)	
						if matriz.matriz_blit[x][y] != "b":
							matriz.percorre((x,y))	
						
						if matriz.matriz_blit[x][y] == 1:
							display.blit(img_nums[0],(x*30,y*30))
						
						elif matriz.matriz_blit[x][y] == 2:
							display.blit(img_nums[1],(x*30,y*30))
		
						elif matriz.matriz_blit[x][y] == 3:
							display.blit(img_nums[2],(x*30,y*30))
					
						elif matriz.matriz_blit[x][y] == 4:
							display.blit(img_nums[3],(x*30,y*30))
					   
						elif matriz.matriz_blit[x][y] == 5:
							display.blit(img_nums[4],(x*30,y*30))
					
						elif matriz.matriz_blit[x][y] == 6:
							display.blit(img_nums[5],(x*30,y*30))
					
						elif matriz.matriz_blit[x][y] == 7:
							display.blit(img_nums[6],(x*30,y*30))
					
						elif matriz.matriz_blit[x][y] == 8:
							display.blit(img_nums[7],(x*30,y*30))
		
						elif matriz.matriz_blit[x][y] == "*":
							for i in matriz.pos_bomba:
								matriz.matriz_blit[i[1]][i[0]] = matriz.matriz[i[1]][i[0]]
								time.sleep(0.01)
								som_perdeu.play()
								display.blit(bomba,(i[1]*30,i[0]*30))
								pygame.display.update()
							time.sleep(2)
							lost()
							return
								
					except: pass
			
								
				for a in range(len(matriz.matriz_blit)):		
					for b in range(len(matriz.matriz_blit[0])):
						if matriz.matriz_blit[a][b] == 9:
							display.blit(fundo,(a*30,b*30))
								
						if event.type == MOUSEBUTTONDOWN and pygame.mouse.get_pressed()[0]:
							
							if matriz.matriz_blit[a][b] == 0 :
								display.blit(vazio,(a*30,b*30))	
							
							if matriz.matriz_blit[a][b] == 1:
								display.blit(img_nums[0],(a*30,b*30))
							
							if matriz.matriz_blit[a][b] == 2:
								display.blit(img_nums[1],(a*30,b*30))
								
							if matriz.matriz_blit[a][b] == 3:
								display.blit(img_nums[2],(a*30,b*30))
								
							if matriz.matriz_blit[a][b] == 4:
								display.blit(img_nums[3],(a*30,b*30))
							
							if matriz.matriz_blit[a][b] == 5:
								display.blit(img_nums[4],(a*30,b*30))
								
							if matriz.matriz_blit[a][b] == 6:
								display.blit(img_nums[5],(a*30,b*30))
								
							if matriz.matriz_blit[a][b] == 7:
								display.blit(img_nums[6],(a*30,b*30))
							
							if matriz.matriz_blit[a][b] == 8:
								display.blit(img_nums[7],(a*30,b*30))
												
	
	
	
		segundos = int(round(pygame.time.get_ticks()/1000)) - time_init
		secs = texto.render(str(segundos),True,cor)
		pygame.draw.rect(display,(174,112,40),Rect(0,matriz.coluna*30,matriz.linha*30,30))
		display.blit(secs,((3.3*matriz.linha*30)/8,matriz.coluna*30+5))
		
		pygame.display.update()
		

	pygame.display.quit()
	
def lost():
	
	display = pygame.display.set_mode((800,600), 0, 32)
	fundo = pygame.image.load("Novas_Imagens" + os.sep + "fundo_perdeu.png").convert_alpha()
	game_over = pygame.image.load("Novas_Imagens" + os.sep + "game_over.png").convert_alpha()
	cor = (255, 255, 255)
	texto = pygame.font.SysFont("Courrier New", 37)
	posicao_game_over = (200, 0)
	clock = pygame.time.Clock()
	pressed = False
	
	funcionando = True
	
	while funcionando:
		clock.tick(30)
		for event in pygame.event.get():
			if event.type == QUIT:
				funcionando = False
			if event.type == KEYDOWN and event.key == K_ESCAPE:
				funcionando = False
			if event.type == KEYDOWN and event.key == K_RETURN:
				funcionando = False
				return
		
		#chamada a utilização do mouse
		posicao_mouse = pygame.mouse.get_pos()
		tecla = pygame.key.get_pressed()
		if tecla == K_ESCAPE:
			exit()
		display.blit(fundo,(0,0))
		linha_blit = texto.render("Pressione ESC para voltar ao Menu principal.", True, cor)
		display.blit(linha_blit, (230, 550))
		display.blit(game_over , posicao_game_over)
		pygame.display.update()

def win(modo,tempo):
	
	display = pygame.display.set_mode((800,600), 0, 32)
	fundo_1 = pygame.image.load("Novas_Imagens" + os.sep + "venceu.png").convert_alpha()
	fundo_2 = pygame.image.load("Novas_Imagens" + os.sep + "ganhou.png").convert_alpha()
	clock = pygame.time.Clock()
	texto = pygame.font.SysFont("comic sams",43, bold = False)
	texto2 = pygame.font.SysFont("comic sams",20, bold = False)
	cor = (255, 255, 255)
	funcionando,escreve = True,True
	nome = ""
	
	while funcionando:
		clock.tick(30)
		for event in pygame.event.get():
			if event.type == QUIT:
				funcionando = False
			if event.type == KEYDOWN and event.key == K_ESCAPE:
				funcionando = False
			if event.type == KEYDOWN and event.key == K_RETURN:
				funcionando = False
				return
		
		#### verifica se o player vai entrar no ranking ####
		posicao_verificada = verifica_rank(modo,tempo)
		if modo != "" and posicao_verificada != None:
			
			while escreve:
				clock.tick(30)
	         
				blit_nome = texto.render(("%s"%nome),True,(255,255,255))
				display.fill((0,0,255))
				display.blit(fundo_1,(0,0))
				#pygame.draw.rect(display,(255,255,255),(0,0,800,600),500)
				display.blit(blit_nome,(460,450))
	         
	         
				for event in pygame.event.get():
				   if event.type == QUIT:
				      escreve = False
				
				   elif event.type == KEYDOWN:
				      if event.key == pygame.K_ESCAPE:
				         escreve = False
				
				      elif event.key == K_BACKSPACE:
				         nome = nome[:-1]
				      elif event.key == K_KP_ENTER or event.key == K_RETURN:
				         escreve = False
				
				      else:
				         try:
				            if not  len(nome) >= 11:
				               nome += str(event.unicode)
				         except: pass 
				pygame.display.update()
			
			
			##### evento de escrever no ranking #####	
			lista_nome_posic = [nome,tempo]  
			dicionario_rank = cPickle.load(file(modo))
				
			insereRank(dicionario_rank, posicao_verificada, lista_nome_posic)   
			cPickle.dump(dicionario_rank,file(modo,"w"))
			return
			
		elif modo != "":
			tecla = pygame.key.get_pressed()
			if tecla == K_ESCAPE:
				exit()
			display.blit(fundo_2,(0,0))
			mensagem = "Parabens vc ganhou, mas %d nao esta entre os 5 melhores tempos!"  % tempo
			mensagem2 = "Aperte Esc para voltar ao menu."
			linha_blit = texto2.render(mensagem, True, cor)
			linha_blit2 = texto2.render(mensagem2, True, cor)
			display.blit(linha_blit, (210, 520))
			display.blit(linha_blit2, (290, 532))
			
			pygame.display.update()
			
		else:
			tecla = pygame.key.get_pressed()
			if tecla == K_ESCAPE:
				exit()
			display.blit(fundo_2,(0,0))
			mensagem = "Parabens vc ganhou! Aperte Esc para voltar ao menu."
			linha_blit = texto2.render(mensagem, True, cor)
			display.blit(linha_blit, (210, 540))
			
			pygame.display.update()
		
		
		
	return
